<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>实习日志</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
            line-height: 1.6;
            color: #333;
            max-width: 1200px;
            margin: 0 auto;
            padding: 0 20px;
        }
        header {
            text-align: center;
            padding: 20px 0;
            border-bottom: 1px solid #eee;
        }
        nav {
            margin: 20px 0;
        }
        nav ul {
            list-style-type: none;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            gap: 20px;
        }
        nav ul li {
            cursor: pointer;
            padding: 5px 10px;
            border-radius: 5px;
        }
        nav ul li:hover {
            background-color: #f5f5f5;
        }
        section {
            margin: 40px 0;
            padding: 20px;
            border-radius: 5px;
            background-color: #f9f9f9;
        }
        h2 {
            border-bottom: 1px solid #ddd;
            padding-bottom: 10px;
        }
        .team-members {
            display: grid;
            grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
            gap: 20px;
        }
        .team-member {
            text-align: center;
            padding: 15px;
            background-color: white;
            border-radius: 5px;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
        }
        .team-member img {
            width: 100px;
            height: 100px;
            border-radius: 50%;
            object-fit: cover;
            margin-bottom: 10px;
        }
        .journal-entry {
            margin-bottom: 20px;
            padding: 15px;
            background-color: white;
            border-radius: 5px;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
        }
        .journal-date {
            font-weight: bold;
            color: #666;
        }
        footer {
            text-align: center;
            padding: 20px 0;
            border-top: 1px solid #eee;
            color: #666;
        }
        .placeholder {
            color: #888;
            font-style: italic;
        }
    </style>


<body>
    <header>
        <h1>实习日志</h1>
        <p>记录实习期间的成长与收获</p>
    </header>

    <nav>
        <ul>
            <li onclick="showSection('overview')">项目概述</li>
            <li onclick="showSection('team')">团队成员</li>
            <li onclick="showSection('journal')">实习日志</li>
        </ul>
    </nav>

    <section id="overview" class="active">
        <h2>项目概述</h2>
        <p class="placeholder">工程创新实践：电动卡丁车的开发</p>
        <p class="placeholder">以三电系统为核心系统开发
<pre>
总体结构：低功率版本包含 12V 2 并 3 串锂电池组、ESP32 控制板 + INA219 电压电流测量、
550 电机 + 减速箱 + 轮毂、铝型材车架等部件。
电驱系统：由 12V 2 并 3 串锂电池组、INA219 电压电流测量、控制板、550 电机 + 减速箱 + 轮毂等构成
电控系统：包含 12V 2 并 3 串锂电池组、ESP32 控制板 + INA219 电压电流测量等部件，
有液晶屏幕、挡位、油门、等原件
电池系统：采用 12V 2 并 3 串锂电池组，包含 INA219 电压电流测量、开关、3.3VDC-DC 稳压模块、电芯、
3 串锂电池保护板等，介绍了各元器件参数、搭建步骤及效果测试。
机械结构：有多种方案，如差速转向两驱、差速转向四驱等，涉及车架、前轴、后轴、转向机构等零部件，
本小组选择机械转动系统。</pre>
</p>
    </section>

    <section id="team">
        <h2>团队成员</h2>
        <div class="team-members">
            <!-- 任泽华 -->
            <div class="team-member">
                <img src="https://picsum.photos/seed/member1/100/100" alt="成员照片">
                <h3>任泽华</h3>
                <p>电控组</p>
                <p class="placeholder">参与电控系统调试</p>
            </div>
            
            <!-- 司烽彤 -->
            <div class="team-member">
                <img src="https://picsum.photos/seed/member2/100/100" alt="成员照片">
                <h3>司峰彤</h3>
                <p>电控组</p>
                <p class="placeholder">参与电控系统调试</p>
            </div>
            
            <!-- 朱秋彤 -->
            <div class="team-member">
                <img src="https://picsum.photos/seed/member3/100/100" alt="成员照片">
                <h3>朱秋彤</h3>
                <p>电驱组</p>
                <p class="placeholder">参与驱动系统调试</p>
            </div>
            
            <!-- 杨天宝 -->
            <div class="team-member">
                <img src="https://picsum.photos/seed/member4/100/100" alt="成员照片">
                <h3>杨天宝</h3>
                <p>电池组</p>
                <p class="placeholder">参与电池设计与组装</p>
            </div>
            
            <!-- 张瑞 -->
            <div class="team-member">
                <img src="https://picsum.photos/seed/member5/100/100" alt="成员照片">
                <h3>张瑞</h3>
                <p>电池组</p>
                <p class="placeholder">参与电池设计与组装</p>
            </div>
        </div>
    </section>

    <section id="journal">
        <h2>实习日志（14天）</h2>
        
        <!-- 第1天 -->
        <div class="journal-entry">
            <div class="journal-date">第1天 (日期：7.5)</div>
            <p class="placeholder">在下午15：00全组成员参与了实习安全大会，学习到了实习的记录安排，有关实验室安全的规则，组员之间互相认识，准备第二天启程</p>
        </div>
        
        <!-- 第2天 -->
        <div class="journal-entry">
            <div class="journal-date">第2天 (日期：7.6)</div>
            <p class="placeholder">9；00出发前往西南交通大学峨眉校区，到达之后略做休整，下午2：30开始“走出实验室”用户调研今日参与短学期暑期实习，围绕“为校园设计安全便捷包容的载人电动交通工具”开展实践。先是进行“走出实验室”用户研究任务，我们小组奔赴校园多个地点，如6201教室、院士楼等，途中用第四纪APP打点记录，填写观察记录表，还对不同人群（学生、教职工、带小孩家长 ）进行访谈，亲身体验“问题路段” 。下午返回6201教室分享调研，通过故事分享会、构建用户画像、定义核心问题，挖掘设计需求。晚上则要用Git和HTML记录实习日志。</p>
        </div>
        
        <!-- 第3天 -->
        <div class="journal-entry">
            <div class="journal-date">第3天 (日期：7.7)</div>
            <p class="placeholder">
            电驱组：由于一开始就已经搭建好开发环境，先对分发的wemos lolin32 lite 开发板进行引脚认识与开发板调试。使用如下blink程序测试开发板
            电控组：搞摇杆的测试
            <pre>
        #include <Arduino.h>

// 定义引脚
const int xAxisPin = 34; // X轴信号线连接到gpio34
const int yAxisPin = 35; // Y轴信号线连接到gpio35
const int buttonPin = 32; // 摇杆按钮信号线连接到gpio32

// 定义阈值
const int leftThreshold = 1024;
const int rightThreshold = 3072;
const int upThreshold = 1024;
const int downThreshold = 3072;

void setup() {
  // 初始化串口通信
  Serial.begin(115200);

  // 设置引脚模式
  pinMode(xAxisPin, INPUT);
  pinMode(yAxisPin, INPUT);
  pinMode(buttonPin, INPUT_PULLUP); // 使用上拉电阻
}

void loop() {
  // 读取X轴和Y轴的模拟值
  int xAxisValue = analogRead(xAxisPin);
  int yAxisValue = analogRead(yAxisPin);

  // 读取按钮状态
  bool buttonState = digitalRead(buttonPin) == LOW;

  // 判断摇杆方向
  if (buttonState) {
    Serial.println("Brake");
  } else if (xAxisValue < leftThreshold) {
    Serial.println("Left");
  } else if (xAxisValue > rightThreshold) {
    Serial.println("Right");
  } else if (yAxisValue < upThreshold) {
    Serial.println("Up");
  } else if (yAxisValue > downThreshold) {
    Serial.println("Down");
  } else {
    Serial.println("Stop");
  }

  // 延迟一段时间以避免重复打印
  delay(200);</pre></p>
            <pre>
void setup() {
pinMode(LED_BUILTIN, OUTPUT);  
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  
  delay(1000);                      
  digitalWrite(LED_BUILTIN, LOW);   
  delay(1000);                      
}
板载led灯可以正常亮灭交替，开发板功能完好，根据对网址https://deepbluembedded.com/arduino-bts7960-dc-motor-driver/对学习，
了解到BTS7960的引脚作用，知道可以用PWM技术来控制直流电机。            
接下来焊接开发板，选择GND，3.3v和支持PWM的引脚进行焊接，最终选择了GPIO12、14、23、25、26、27，构想用电位器控制电机转速，
将电位器的电压值映射到一个由正到负的区域，负代表反转，正代表正转，所以我们需要支持电位器连接的某个模拟输入引脚，后为实现功能，有如下代码。           </p>
  const int POT_PIN = 27;   //电位器接IO27引脚
const int RPWM_PIN = 12;  //BTS7960 RPWM接IO12引脚
const int LPWM_PIN = 14;  //BTS7960 LPWM接IO14引脚


const int PWM_FREQ = 5000;  // 5kHz频率
const int PWM_RES = 8;       // 8位分辨率 (0-255)
const int PWM_CH_R = 0;      // LEDC通道0
const int PWM_CH_L = 1;      // LEDC通道1

void setup() {// 配置PWM通道
  ledcSetup(PWM_CH_R, PWM_FREQ, PWM_RES);
  ledcSetup(PWM_CH_L, PWM_FREQ, PWM_RES);
  ledcAttachPin(RPWM_PIN, PWM_CH_R);
  ledcAttachPin(LPWM_PIN, PWM_CH_L);
}

void loop() {
  int potValue = analogRead(POT_PIN);// 读取电位器值 (0-4095)
  int motorSpeed = map(potValue, 0, 4095, -255, 255);  // 映射到-255~255

  // 控制电机方向与速度
  if (motorSpeed > 0) {// 正转
    ledcWrite(PWM_CH_R, abs(motorSpeed));
    ledcWrite(PWM_CH_L, 0);
  } else if (motorSpeed < 0) {// 反转
    ledcWrite(PWM_CH_R, 0);
    ledcWrite(PWM_CH_L, abs(motorSpeed));
  } else {// 停止
    ledcWrite(PWM_CH_R, 0);
    ledcWrite(PWM_CH_L, 0);
  }
  
  delay(20);  // 短暂延时
}
</pre>
<p>电驱组：然后进行接线，成功让电机实现正反转动</p>     


电池组：列出电池系统所需材料清单，选择电池布局为三串两并的方式，安装好了电池充电器，调节好了3.3vDC-DC稳压模块


<p>电控组：早上8：30通过李君老师的授课，小组完整了解到了电控系统的大致内容，首先经过组内商讨，确定了本小组项目由差速转向＋ESP32控制有刷电机的整体框架，确定出电控系统的大致目标：通过OLED屏幕上的界面变化反映出电位器和油门的调整。之后开始工作。
第一步，由于本小组个人的电脑之前并没有完成ESP32的开发板在ArduinoIDE的开发环境搭建，所以先开始环境搭建工作，先在小组其他成员处拷贝到了ESP系列的离线压缩包，随后根据李君老师提供的视频完成环境的搭建（链接https://www.bilibili.com/video/BV1To4y1p759）

第二步，开始测试ESP32板子是否正常工作，首先在Arduino软件上选择“WEMOS lololin 32 lite”开发板以及对应端口开始测试，运用Arduino自带的blink闪灯测试程序（文件-示例-0.1Basics-Blink），上传成功后，发现指示灯正常闪烁，完成测试。

第三步，测试OLED是否正常工作，首先编写文本显示代码如下</p>
<pre>
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("文本测试");
display.setTextSize(2);
display.setCursor(0, 16);
display.println("Hello World!");
display.setTextSize(1);
display.setCursor(0, 40);
display.println("1234567890");
display.println("abcdefghij");
display.display();
delay(3000);</pre>
<p>利用一些基础文本的显示测试OLED工作，接下来是接线，查阅有关资料和视频，将OLED的VCC接3.3V,GND接GND，SCL接16，SDA接17（资料显示接21，22，由于引脚限制重新定义了引脚，代码如下）</p>
<pre>
 // 重新定义I2C引脚
#define SDA_PIN 16
#define SCL_PIN 17
#define SCREEN_WIDTH 128    // OLED显示宽度，单位:像素
#define SCREEN_HEIGHT 64    // OLED显示高度，单位:像素
#define OLED_RESET    -1    // Reset pin # 
#define SCREEN_ADDRESS 0x3C /// OLED I2C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
接好线后发现OLED工作正常，测试完成

第四步搭建电位器测试电路，编写程序，获取电位器采样数据，代码如下：
const int POT_PIN = 33;  // 电位器连接到GPIO33
void setup() {
  Serial.begin(115200);  // 初始化串口通信
 // 初始化OLED
 if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
   Serial.println(F("SSD1306 display initialization failed"));
   for(;;); // 停止执行，进入无限循环
 }
  
 // 配置ADC设置
 analogSetAttenuation(ADC_11db);  // 设置11dB衰减，允许测量0-3.3V范围
 analogReadResolution(12);        // 设置12位分辨率(0-4095)
 
  // 清屏并显示初始信息
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Initializing...");
  display.display();
  delay(1000);
}

void loop() {
  // 读取电位器原始值(0-4095)
  int sensorValue = analogRead(POT_PIN);
  
  // 将原始值转换为电压(0-3.3V)
  float voltage = sensorValue * (3.3 / 4095.0);
  
  // 将电压转换为百分比(0-100%)
  int percentage = (int)(voltage / 3.3 * 100);
  // 输出到串口监视器
  Serial.print("Raw Value: ");
  Serial.print(sensorValue);
  Serial.print(" | Voltage: ");
  Serial.print(voltage, 2);  // 保留两位小数
  Serial.print("V | Percentage: ");
  Serial.print(percentage);
// 更新OLED显示
  display.clearDisplay();
  
  // 显示电压值（位置上移）
  display.setTextSize(2);
  display.setCursor(0, 10);  // 位置从20调整为10，填补标题行移除后的空间
  display.print(voltage, 2);  // 显示电压值，保留两位小数
  display.print(" V");
  
  // 显示百分比
  display.setTextSize(1);
  display.setCursor(0, 35);  // 位置从45调整为35
  display.print("Percentage: ");
  display.print(percentage);
  display.print("%");
  
  // 绘制进度条
  display.drawRect(0, 50, 128, 8, SSD1306_WHITE);  // 进度条位置上移
  display.fillRect(2, 52, percentage * 124 / 100, 4, SSD1306_WHITE);  // 进度条位置上移
  
display.display();  // 更新显示
  
  delay(100);  // 延时100毫秒，控制更新频率
}

（从总的代码中截取，去掉了油门的部分，仅供参考）
接线，由于3.3V和GND引脚要接多个线，采用面包板接线，
电位器接线情况为，电位器两端的端口接3.3V和GND，构成回路，中间接33
接线通电后测试达到效果。
</pre>

<p>第五步，将脚踏开关（油门）的开合投到显示屏上
编写代码如下：</p>
<pre>
// 读取脚踏开关状态：LOW表示踩下，HIGH表示未踩下
  bool isThrottlePressed = digitalRead(THROTTLE_SWITCH_PIN) == LOW;
Serial.print("% | Throttle State: ");
  Serial.println(isThrottlePressed ? "ACCELERATING" : "IDLE");
  // 当踩下油门时显示"ACCEL"
  if (isThrottlePressed) {
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(90, 0);  // 右上角显示
    display.println("ACCEL");
  }
</pre>
<p>原先设想为在油门踩下时在OLED屏幕上显示“加速”但在代码编辑时遇到中文乱码的问题，在尝试诸多方法未解决后，转换思路，换成英文单词ACCEL代替。
接线情况，油门一条线接GND，一条线接25
测试结果理想，今日工作结束</p>


</div>
        
        <!-- 第4天 -->
        <div class="journal-entry">
            <div class="journal-date">第4天 (日期：7.8)</div>
            <p class="placeholder">
                电驱组：今日主要对电机的控制进行研究，第一步：是学习有关bts7960的相关知识。第二步：将esp32开发板与bts7960电驱模组以及电位计和电池电机连起来。第三步：进行连线由于多个接口需要接入3.3V，于是将起并联到面包板上。
                对于BTS7960 VCC、R_EN、L_EN接入开发板3.3V，GND接入GND，RPWM，LPWM分别接入IO12与14。Vm+与Vm-分别接入电源正负极，Motor+与Motor-接入550电机。对于电位器，中间接IO27，两侧引脚接3.3V与GND。
                第四步：接线完成。烧录程序开启直流电源电压12V，电流2A。电机成功转动调节电位器，可以实现正转反转与加速减速，具体在电位器调到中间电压，电机不转动，上调电压电机正转并加速，从中间电压往下调电机反转并减速。
                今日还进行了电路板的绘制，在嘉立创eda上面进行了绘制，并将电路板转为了pcb版
                <pre>
                // 引脚定义
const int POT_PIN = 34;    // 电位计接GPIO34
const int R_EN = 18;       // 右使能
const int L_EN = 19;       // 左使能
const int RPWM = 16;       // 右PWM
const int LPWM = 17;       // 左PWM

// PWM参数
const int PWM_FREQ = 5000;  // PWM频率(Hz)
const int PWM_RES = 8;      // 8位分辨率(0-255)
const int PWM_CHANNEL_R = 0; // PWM通道0
const int PWM_CHANNEL_L = 1; // PWM通道1

void setup() {
  // 初始化使能引脚
  pinMode(R_EN, OUTPUT);
  pinMode(L_EN, OUTPUT);
  digitalWrite(R_EN, HIGH);  // 永久使能右通道
  digitalWrite(L_EN, HIGH);  // 永久使能左通道

  // 配置PWM通道
  ledcSetup(PWM_CHANNEL_R, PWM_FREQ, PWM_RES);
  ledcSetup(PWM_CHANNEL_L, PWM_FREQ, PWM_RES);
  ledcAttachPin(RPWM, PWM_CHANNEL_R);
  ledcAttachPin(LPWM, PWM_CHANNEL_L);

  // 初始化串口（调试用）
  Serial.begin(115200);
}

void loop() {
  // 读取电位计值 (0-4095)
  int potValue = analogRead(POT_PIN);
  
  // 映射到PWM范围 (-255 ~ +255)
  int motorSpeed = map(potValue, 0, 4095, -255, 255);

  // 死区处理 (防止中间位置抖动)
  if (abs(motorSpeed) < 20) motorSpeed = 0;

  // 控制电机
  if (motorSpeed > 0) {
    // 正转：RPWM输出速度，LPWM置0
    ledcWrite(PWM_CHANNEL_R, motorSpeed);
    ledcWrite(PWM_CHANNEL_L, 0);
  } else if (motorSpeed < 0) {
    // 反转：LPWM输出速度，RPWM置0
    ledcWrite(PWM_CHANNEL_R, 0);
    ledcWrite(PWM_CHANNEL_L, abs(motorSpeed));
  } else {
    // 停止
    ledcWrite(PWM_CHANNEL_R, 0);
    ledcWrite(PWM_CHANNEL_L, 0);
  }

  // 调试输出
  Serial.print("Pot: ");
  Serial.print(potValue);
  Serial.print(" | Speed: ");
  Serial.println(motorSpeed);
  
  delay(20); // 短暂延时
}</pre>
                电控组：剩余的全部代码搞定
                <pre>
#include <Arduino.h>

// 引脚定义
#define THROTTLE_SWITCH_PIN 13  // 连接脚踏开关的引脚（GPIO13）
#define LED_PIN 2               // 内置LED指示油门状态

// 油门状态
bool throttleEngaged = false;
bool lastThrottleState = false;
unsigned long throttlePressTime = 0;
const unsigned long THROTTLE_HOLD_TIME = 1000; // 油门持续激活时间(ms)

void setup() {
  Serial.begin(115200);
  
  // 配置引脚模式
  pinMode(THROTTLE_SWITCH_PIN, INPUT_PULLUP);  // 启用内部上拉电阻
  pinMode(LED_PIN, OUTPUT);
  
  Serial.println("油门控制系统启动");
  Serial.println("等待油门激活...");
}

void loop() {
  // 读取油门开关状态
  bool currentSwitchState = digitalRead(THROTTLE_SWITCH_PIN) == LOW;
  
  // 检测油门状态变化
  if (currentSwitchState != lastThrottleState) {
    // 消抖延迟
    delay(50); 
    currentSwitchState = digitalRead(THROTTLE_SWITCH_PIN) == LOW;
    
    if (currentSwitchState != lastThrottleState) {
      // 油门被踩下
      if (currentSwitchState) {
        throttleEngaged = true;
        throttlePressTime = millis();
        Serial.println("油门激活");
        
        // 驱动LED显示
        digitalWrite(LED_PIN, HIGH);
        
        // 启动油门控制功能
        activateThrottle();
      } 
      // 油门被释放
      else {
        throttleEngaged = false;
        Serial.println("油门解除");
        
        // 关闭LED
        digitalWrite(LED_PIN, LOW);
        
        // 执行刹车功能
        deactivateThrottle();
      }
      
      lastThrottleState = currentSwitchState;
    }
  }
  
  // 当油门保持被踩下状态时的连续控制
  if (throttleEngaged) {
    // 持续油门控制 - 例如按比例控制速度
    maintainThrottle();
    
    // 额外的安全逻辑 - 如果踩下超过3秒警告
    if (millis() - throttlePressTime > 3000) {
      Serial.println("警告：油门激活时间过长！");
    }
  }
  
  // 其他系统逻辑
  // ...
}

// 油门激活处理函数
void activateThrottle() {
  // 这里实现油门激活功能
  // 例如：启动电机、增加速度等
  Serial.println("系统：油门激活控制执行");
  
  // 实际控制代码可根据需要添加，例如：
  // analogWrite(MOTOR_PWM_PIN, 200); // 设置PWM输出
}

// 油门持续控制函数
void maintainThrottle() {
  // 这里实现油门持续被踩下时的控制逻辑
  // 例如：根据压力传感器调整速度 (如果有模拟输入)
  // 当前仅作为占位函数
}

// 油门解除处理函数
void deactivateThrottle() {
  // 这里实现油门解除功能
  // 例如：刹车、减速等
  Serial.println("系统：执行刹车功能");
  
  // 实际控制代码，例如：
  // analogWrite(MOTOR_PWM_PIN, 0); // 停止电机
  // activateBrakes(); // 激活刹车系统
}
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

/* 屏幕尺寸定义 */
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

/* 自定义I2C引脚 */
#define SDA_PIN 4
#define SCL_PIN 15

/* 电池监测引脚 */
#define BATTERY_PIN 34

/* 电池参数 */
const float MAX_VOLTAGE = 4.2;
const float MIN_VOLTAGE = 3.3;
const float VOLTAGE_DIVIDER = 2.0;

/* 初始化 */
TwoWire myWire = TwoWire(0);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &myWire, OLED_RESET);

float voltage = 0.0;    // 存储计算后的电压值
float percent = 0;      // 电池百分比
float currentSpeed = 0.0; // 当前速度
unsigned long lastUpdate = 0; // 上次更新时间

void setup() {
  Serial.begin(115200);           // 初始化串口通信，波特率115200
  analogReadResolution(12);       // 设置ADC分辨率为12位（0-4095）
  analogSetAttenuation(ADC_11db);  // 设置ADC衰减为11dB（量程0-3.3V）
  myWire.begin(SDA_PIN, SCL_PIN, 400000); // 初始化I2C
  
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306初始化失败"));
    while(1);
  }
  
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.display();
}

void loop() {
  // 读取电池电压
  int adcValue = analogRead(BATTERY_PIN);    // 读取ADC原始值（0-4095）
  voltage = (adcValue * 3.3) / 4095.0 * VOLTAGE_DIVIDER;  // 转换为电压值
  percent = (voltage - MIN_VOLTAGE) * 100 / (MAX_VOLTAGE - MIN_VOLTAGE);  // 计算百分比
  percent = constrain(percent, 0, 100); // 限制在0-100范围内
  
  // 更新速度（模拟）
  updateSpeed();
  
  // 通过串口发送数据到电脑
  Serial.print("ADC Value: ");
  Serial.print(adcValue);
  Serial.print(" | Voltage: ");
  Serial.print(voltage, 3); 
  Serial.print("V");
  Serial.print(" | Percentage: ");
  Serial.print(percent, 1);
  Serial.println("%");
  Serial.print("Speed: ");
  Serial.print(currentSpeed, 1);
  Serial.println(" km/h");

  // OLED显示
  display.clearDisplay();  // 清空屏幕
  
  // 显示标题
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print("Battery Monitor");
  
  // 绘制分隔线
  display.drawLine(0, 10, 128, 10, SSD1306_WHITE);
  
  // 显示电压值
  display.setCursor(0, 15);
  display.print("Voltage:");
  display.setCursor(60, 15);
  display.print(voltage, 2);
  display.print("V");
  
  // 显示百分比
  display.setCursor(0, 25);
  display.print("Percent:");
  display.setCursor(60, 25);
  display.print(percent, 1);
  display.print("%");
  
  // 绘制电池图标
  drawBatteryIcon(0, 35, percent);
  
  // 显示速度
  display.setCursor(0, 50);
  display.print("Speed:");
  display.setCursor(60, 50);
  display.print(currentSpeed, 1);
  display.print(" km/h");
  
  display.display();
  
  delay(500); // 刷新间隔
}

void updateSpeed() {
  if (millis() - lastUpdate > 1000) {
    currentSpeed += 5.3;
    if (currentSpeed > 100) currentSpeed = 0;
    lastUpdate = millis();
  }
}

void drawBatteryIcon(int x, int y, int percent) {
  // 电池外框
  display.drawRect(x, y, 30, 10, SSD1306_WHITE);
  // 电池正极
  display.fillRect(x + 30, y + 2, 2, 6, SSD1306_WHITE);
  // 电量填充
  int fillWidth = map(percent, 0, 100, 0, 28);
  display.fillRect(x + 1, y + 1, fillWidth, 8, SSD1306_WHITE);
}</pre>
                电池组：
电池连接原理方案；
3 串电池依次连接，通过 B+ 、 B2 、 B1 、 B- 接口与保护板对应端连接，实现对 3 串电池的保护，同时有 DC 插座用于输入，需确保接线顺序与接口对应，保障电路通断及保护功能生效。
测试开关，大致确定整体电池系统的链接布局

        </div>
        
        <!-- 第5天 -->
        <div class="journal-entry">
            <div class="journal-date">第5天 (日期：___2025年7月9日___)</div>
            <p class="placeholder">电池组：将开关焊接好了，并处理了有关INA129电压电流测量模块的线路连接和供电情况，在ardino开发环境中编写了测量电压电流的C++编写代码如下：
                <pre>#include <Wire.h>
#include <Adafruit_INA219.h>

#define CUSTOM_SDA 19
#define CUSTOM_SCL 22
#define SAMPLES 20  // 采样次数（值越大越稳定，但响应变慢）

Adafruit_INA219 ina219;

void setup() {
  Serial.begin(115200);
  Wire.begin(CUSTOM_SDA, CUSTOM_SCL);
  
  if (!ina219.begin()) {
    Serial.println("找不到 INA219 模块");
    while(1);
  }
  
  // 选择更精确的量程（根据实际需求选择）
  ina219.setCalibration_32V_1A();  // 32V/1A量程（精度更高）
  
  Serial.println("\n=======================================");
  Serial.println("      INA219 精密电压电流监测系统");
  Serial.println("=======================================");
  Serial.println("接线说明:");
  Serial.println(" 电源正极 → INA219 VIN+");
  Serial.println(" 负载正极 → INA219 VIN-");
  Serial.println(" 电源负极 → INA219 GND 和 负载负极");
  Serial.println("---------------------------------------");
}

// 带滤波的读取函数
float readFilteredVoltage() {
  float sum = 0;
  for(int i=0; i<SAMPLES; i++) {
    sum += ina219.getBusVoltage_V();
    delay(5);
  }
  return sum / SAMPLES;
}

float readFilteredCurrent() {
  float sum = 0;
  for(int i=0; i<SAMPLES; i++) {
    sum += ina219.getCurrent_mA();
    delay(5);
  }
  return sum / SAMPLES;
}

float readFilteredPower() {
  float sum = 0;
  for(int i=0; i<SAMPLES; i++) {
    sum += ina219.getPower_mW();
    delay(5);
  }
  return sum / SAMPLES;
}

void loop() {
  // 读取并滤波所有参数
  float busVoltage = readFilteredVoltage();
  float shuntVoltage = ina219.getShuntVoltage_mV() / 1000.0;
  float current = readFilteredCurrent();
  float power = readFilteredPower();
  float loadVoltage = busVoltage + shuntVoltage;
  
  // 格式化输出
  Serial.println("\n============== 测量数据 ==============");
  
  Serial.print("电源输出电压: ");
  Serial.print(loadVoltage, 3); 
  Serial.println(" V");
  
  Serial.print("负载两端电压: ");
  Serial.print(busVoltage, 3); 
  Serial.println(" V");
  
  Serial.print("采样电阻压降: ");
  Serial.print(shuntVoltage, 4);  // 4位小数显示小电压
  Serial.println(" V");
  
  Serial.print("输出电流:     ");
  Serial.print(current, 1); 
  Serial.println(" mA");
  
  Serial.print("输出功率:     ");
  Serial.print(power, 1); 
  Serial.println(" mW");
  
  Serial.println("=====================================");
  
  // 添加状态指示器
  static int count = 0;
  count = (count + 1) % 4;
  Serial.print("状态: [");
  for(int i=0; i<4; i++) {
    Serial.print(i == count ? '*' : '-');
  }
  Serial.println("]");
  
  delay(1500);  // 更新间隔
}</pre>
   电驱组：今日与电控组进行了关键对接，标志着两组成果进入首次融合阶段。经过多轮密集调试，核心功能取得突破：已成功实现通过摇杆对电机转速的稳定控制，验证了基础控制链路和硬件接口的有效性。然而，在实现差速转弯功能方面，我们仍面临挑战，这涉及到左右轮速的独立精细控制与协调逻辑。目前相关算法或参数仍需调整优化。明日计划聚焦于攻克差速转弯的核心技术难点，力争完成初步集成。。       
            </p>
        </div>
        
        <!-- 第6天 -->
        <div class="journal-entry">
            <div class="journal-date">第6天 (日期：___7月10日___)</div>
            <p class="placeholder">在此处添加第6天的实习内容...</p>
        </div>
        电池组：将锂电池6节接在一起，并用镍片焊接在一起，最后用绝缘胶带缠绕得到了锂电池组，并用充电装充电
        重新测试了，INA129稳压模块，并修改了代码使其测量电流和电压的误差在2%以内
        代码：
         <pre>#include <Wire.h>
#include <Adafruit_INA219.h>

#define CUSTOM_SDA 19
#define CUSTOM_SCL 22
#define SAMPLES 20  // 采样次数（值越大越稳定，但响应变慢）

Adafruit_INA219 ina219;

void setup() {
  Serial.begin(115200);
  Wire.begin(CUSTOM_SDA, CUSTOM_SCL);
  
  if (!ina219.begin()) {
    Serial.println("找不到 INA219 模块");
    while(1);
  }
  
  // 选择更精确的量程（根据实际需求选择）
  ina219.setCalibration_32V_1A();  // 32V/1A量程（精度更高）
  
  Serial.println("\n=======================================");
  Serial.println("      INA219 精密电压电流监测系统");
  Serial.println("=======================================");
  Serial.println("接线说明:");
  Serial.println(" 电源正极 → INA219 VIN+");
  Serial.println(" 负载正极 → INA219 VIN-");
  Serial.println(" 电源负极 → INA219 GND 和 负载负极");
  Serial.println("---------------------------------------");
}

// 带滤波的读取函数
float readFilteredVoltage() {
  float sum = 0;
  for(int i=0; i<SAMPLES; i++) {
    sum += ina219.getBusVoltage_V();
    delay(5);
  }
  return sum / SAMPLES;
}

float readFilteredCurrent() {
  float sum = 0;
  for(int i=0; i<SAMPLES; i++) {
    sum += ina219.getCurrent_mA();
    delay(5);
  }
  return sum / SAMPLES;
}

float readFilteredPower() {
  float sum = 0;
  for(int i=0; i<SAMPLES; i++) {
    sum += ina219.getPower_mW();
    delay(5);
  }
  return sum / SAMPLES;
}

void loop() {
  // 读取并滤波所有参数
  float busVoltage = readFilteredVoltage();
  float shuntVoltage = ina219.getShuntVoltage_mV() / 1000.0;
  float current = readFilteredCurrent();
  float power = readFilteredPower();
  float loadVoltage = busVoltage + shuntVoltage;
  
  // 格式化输出
  Serial.println("\n============== 测量数据 ==============");
  
  Serial.print("电源输出电压: ");
  Serial.print(loadVoltage, 3); 
  Serial.println(" V");
  
  Serial.print("负载两端电压: ");
  Serial.print(busVoltage, 3); 
  Serial.println(" V");
  
  Serial.print("采样电阻压降: ");
  Serial.print(shuntVoltage, 4);  // 4位小数显示小电压
  Serial.println(" V");
  
  Serial.print("输出电流:     ");
  Serial.print(current, 1); 
  Serial.println(" mA");
  
  Serial.print("输出功率:     ");
  Serial.print(power, 1); 
  Serial.println(" mW");
  
  Serial.println("=====================================");
  
  // 添加状态指示器
  static int count = 0;
  count = (count + 1) % 4;
  Serial.print("状态: [");
  for(int i=0; i<4; i++) {
    Serial.print(i == count ? '*' : '-');
  }
  Serial.println("]");
  
  delay(1500);  // 更新间隔
}</pre>
电驱组：今日成功完成了电驱系统与电控系统的集成联调。核心进展在于通过摇杆实现了对双侧电机转速的独立差速控制，这为后续实现小车的精准转向功能奠定了坚实基础。同时，摇杆功能完备，支持电机正反转的实时切换，按下摇杆按键即可**顺畅、可靠地执行正转与反转指令。当前系统功能验证通过，待电池组供电到位后，即可推进整车联调与后续测试任务
代码<pre>/*
 * ESP32双BTS7960电机差速控制 + OLED显示
 * 功能：
 * - 摇杆Y轴控制前进/后退速度
 * - 摇杆X轴控制转向差速
 * - OLED实时显示系统状态
 */

//------------------- OLED显示屏配置 -------------------
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//------------------- 电机驱动引脚定义 -------------------
// 左电机
#define L_R_EN 16
#define L_L_EN 17
#define L_RPWM 18
#define L_LPWM 19

// 右电机
#define R_R_EN 26
#define R_L_EN 27
#define R_RPWM 32
#define R_LPWM 33

//------------------- 输入设备引脚定义 -------------------
#define JOY_X 34    // 摇杆X轴
#define JOY_Y 35    // 摇杆Y轴
#define SWITCH_PIN 5 // 开关引脚

//------------------- 参数配置 -------------------
#define PWM_FREQ 10000    // PWM频率(Hz)
#define PWM_RES 8         // 分辨率(bit)
#define DEADZONE 15       // 摇杆死区(ADC值)
#define MIN_PWM 50        // 最小启动PWM
#define MAX_PWM 255       // 最大PWM

//------------------- 全局变量 -------------------
int joyX, joyY;          // 摇杆校准值
int centerX, centerY;    // 摇杆中心点
String motorState = "stop";
int currentSpeed = 0;
unsigned long lastDisplayUpdate = 0;

void setup() {
  // 初始化串口
  Serial.begin(115200);
  
  //------------------- 初始化OLED -------------------
  Wire.begin(15, 13);  // ESP32 I2C引脚（SDA=15, SCL=13）
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("OLED初始化失败"));
    while(1);
  }
  display.clearDisplay();
  display.setTextColor(WHITE);
  
  // 显示开机动画
  displayStartupScreen();
  
  //------------------- 初始化电机控制 -------------------
  pinMode(L_R_EN, OUTPUT);
  pinMode(L_L_EN, OUTPUT);
  pinMode(R_R_EN, OUTPUT);
  pinMode(R_L_EN, OUTPUT);
  
  // 使能所有半桥
  digitalWrite(L_R_EN, HIGH);
  digitalWrite(L_L_EN, HIGH);
  digitalWrite(R_R_EN, HIGH);
  digitalWrite(R_L_EN, HIGH);

  // 配置PWM通道
  ledcSetup(0, PWM_FREQ, PWM_RES);  // 左电机正转
  ledcSetup(1, PWM_FREQ, PWM_RES);  // 左电机反转
  ledcSetup(2, PWM_FREQ, PWM_RES);  // 右电机正转
  ledcSetup(3, PWM_FREQ, PWM_RES);  // 右电机反转
  
  ledcAttachPin(L_RPWM, 0);
  ledcAttachPin(L_LPWM, 1);
  ledcAttachPin(R_RPWM, 2);
  ledcAttachPin(R_LPWM, 3);

  // 初始化开关
  pinMode(SWITCH_PIN, INPUT_PULLUP);

  // 摇杆校准
  calibrateJoystick();
  Serial.println("系统初始化完成！");
}

void loop() {
  // 1. 读取摇杆值
  readJoystick();
  
  // 2. 计算电机速度
  int baseSpeed = map(joyY, -1024, 1024, -MAX_PWM, MAX_PWM);
  int turnDiff = map(abs(joyX), 0, 1024, 0, MAX_PWM) * (joyX > 0 ? 1 : -1);
  
  // 3. 差速控制
  int leftSpeed = constrain(baseSpeed + turnDiff, -MAX_PWM, MAX_PWM);
  int rightSpeed = constrain(baseSpeed - turnDiff, -MAX_PWM, MAX_PWM);
  
  // 4. 更新电机状态显示
  updateMotorState(leftSpeed, rightSpeed);
  
  // 5. 驱动电机（检查开关状态）
  if(digitalRead(SWITCH_PIN) == LOW) {
    setMotor(0, leftSpeed);
    setMotor(1, rightSpeed);
  } else {
    setMotor(0, 0);
    setMotor(1, 0);
    motorState = "stop(switch)";
  }
  
  // 6. 更新OLED显示（每100ms更新一次）
  if(millis() - lastDisplayUpdate > 100) {
    updateDisplay();
    lastDisplayUpdate = millis();
  }
  
  delay(10);
}

//------------------- 功能函数 -------------------

// 显示开机动画
void displayStartupScreen() {
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0, 0);
  display.println(" EM CAR");
  display.println(" 9 GROUP");
  display.display();
  delay(2000);
}

// 更新OLED显示
void updateDisplay() {
  display.clearDisplay();
  display.setTextSize(1);
  
  // 摇杆状态
  display.setCursor(0, 0);
  display.print("X:"); display.print(joyX);
  display.print(" Y:"); display.println(joyY);
  
  // 开关状态
  display.print("stop:");
  display.println(digitalRead(SWITCH_PIN) == LOW ? "ON " : "OFF");
  
  // 电机状态
  display.print("state:"); display.println(motorState);
  
  // 速度显示
  display.print("speed:"); 
  display.print(currentSpeed); 
  display.println("%");
  
  // 电机PWM值
  display.print("L:"); display.print(map(abs(joyY + joyX), 0, 2048, 0, 100));
  display.print("% R:"); display.print(map(abs(joyY - joyX), 0, 2048, 0, 100));
  display.println("%");
  
  display.display();
}

// 更新电机状态
void updateMotorState(int left, int right) {
  currentSpeed = map(constrain(abs(joyY), 0, 1024), 0, 1024, 0, 100);
  
  if(abs(left) < 10 && abs(right) < 10) {
    motorState = "stop";
  } else if(left > 0 && right > 0) {
    motorState = "forward";
  } else if(left < 0 && right < 0) {
    motorState = "backward";
  } else if(left > right) {
    motorState = "turn left";
  } else {
    motorState = "turn right";
  }
}

// 摇杆校准函数
void calibrateJoystick() {
  centerX = 0;
  centerY = 0;
  for(int i=0; i<100; i++) {
    centerX += analogRead(JOY_X);
    centerY += analogRead(JOY_Y);
    delay(10);
  }
  centerX /= 100;
  centerY /= 100;
}

// 读取摇杆值(带死区处理)
void readJoystick() {
  int rawX = analogRead(JOY_X) - centerX;
  int rawY = analogRead(JOY_Y) - centerY;
  
  // 死区处理
  joyX = (abs(rawX) > DEADZONE) ? rawX : 0;
  joyY = (abs(rawY) > DEADZONE) ? rawY : 0;
}

// 电机控制函数
void setMotor(int motor, int speed) {
  speed = constrain(speed, -MAX_PWM, MAX_PWM);
  
  if(motor == 0) { // 左电机
    if(speed > 0) {
      ledcWrite(0, abs(speed));
      ledcWrite(1, 0);
    } else {
      ledcWrite(0, 0);
      ledcWrite(1, abs(speed));
    }
  } else { // 右电机
    if(speed > 0) {
      ledcWrite(2, abs(speed));
      ledcWrite(3, 0);
    } else {
      ledcWrite(2, 0);
      ledcWrite(3, abs(speed));
    }
  }
}</pre>

        <!-- 第7天 -->
        <div class="journal-entry">
            <div class="journal-date">第7天 (日期：__7月11日____)</div>
            <p class="placeholder">
                电池组：制作电池外壳，分析改良制作新的电流测量装置，绘制电池系统的电路原理图
                电控组：与电驱组联动进行代码整合   
                电驱组：与电控组联动进行代码整合
            </p>
        </div>
        
        <!-- 第8天 -->
        <div class="journal-entry">
            <div class="journal-date">第8天 (日期：___7月12日___)</div>
            <p class="placeholder">

工作准备与环境整理：

首先，我对本日项目所需的所有材料进行了仔细清点与核对，确保零部件、工具和耗材齐全无误，避免后续工作因物料缺失而中断。

随后，我对工作台进行了彻底的清洁与整理，移除了不必要的物品，为后续的设计和建模工作创造了一个整洁、安全、高效的操作环境。良好的工作习惯是保证精密工程任务顺利进行的基础。

跨组协作 - 整车概念设计与初步建模：

我们小组的核心任务是进行整车概念设计的讨论与初步3D建模。在讨论中，我们重点考虑了各核心子系统（电驱、电控、电池）的空间布局、机械接口兼容性以及整车结构的初步可行性。目标是建立一个协调统一的基础数字模型框架，为后续各组件的详细设计奠定基础。

分组任务执行：

电控组任务：在完成联合建模讨论后，我回到本组，专注于车辆控制系统的核心硬件设计。我开始了印刷电路板（PCB）的详细绘制工作。这包括根据系统需求进行元器件选型确认、原理图绘制，并开始进行关键的PCB布局布线工作，同时关注信号完整性和潜在的电磁兼容性（EMC）问题。

电池组任务： 我了解到电池组的同事在同步深化整车供电系统方案。他们的工作聚焦于电池包选型的细化、串并联配置优化、热管理策略、电池管理系统（BMS）集成方案以及高压配电设计，目标是形成一个高效、安全、可靠的完整能源解决方案。

多软件建模实践与结构设计：

上午，我们利用Autodesk Fusion 360软件，成功构建了整车的初步三维数字模型。该模型清晰地勾勒出了车辆的主要外形轮廓、关键部件（如电机、电池包、控制器）的初步布局以及基础的车架结构，这为我们提供了一个直观的设计基准。

为了从不同角度验证空间布局和进行更直观的概念展示，我们还创新性地使用Minecraft平台对车辆设计进行了二次建模。这种非传统的方式有助于快速进行空间想象和布局验证。

特别值得一提的是，在Fusion 360建模过程中，我们小组重点对计划采用的铝型材车架结构进行了详细的建模设计。这包括选择合适的铝型材规格、设计关键的连接节点（如角件连接、焊接模拟）、进行初步的力学分析考量以及优化结构以实现轻量化目标。这部分工作让我对车辆承载结构的设计要点有了更深入的理解。

设计回顾与文档完善：

在完成当天的建模和设计工作后，我们小组对所完成的模型文件、设计图纸以及方案文档进行了全面的审阅与初步优化。重点检查了尺寸标注的准确性、模型结构的合理性以及文档描述的清晰度，确保技术细节表达无误，为后续的深入设计和评审做好准备。
            </p>
        </div>
        
        <!-- 第9天 -->
        <div class="journal-entry">
            <div class="journal-date">第9天 (日期：___7月13日___)</div>
            <p class="placeholder">小组整体设计车架结构完善小车布局，派人汇报车架设计
                领取铝型材料，列出车架组装所需配件清单，领取组装所需配件
                在各组工位组装车架，但为领取到配件，已经用铝材切割后铝材搭建出大致结构。
                车架设计定案与汇报：

上午，我们设计小组核心成员进行了集中讨论，对之前完成的整车铝材车架3D模型（Fusion 360）进行了最终的细节审查与优化。重点讨论了结构强度、关键连接节点、轻量化效果以及与电驱、电控、电池等核心子系统的空间兼容性和安装接口问题。

经过充分论证，团队共同完善并最终确定了车架的整体设计方案。随后，小组指派朱秋彤作为代表，向指导老师系统汇报了车架的设计理念、结构特点、选材依据（铝型材）以及预期的性能优势。汇报获得了初步认可，为进入实物制作阶段铺平了道路。

物料筹备与清单制定：

设计方案确认后，我们小组 立即着手进行实物制作的准备工作。首要任务是根据最终定稿的3D模型和设计图纸，详细列出车架组装所需的所有铝型材规格、长度以及各类连接配件清单（包括角件、螺钉、螺母、垫片、T型螺母等）。

随后，我们顺利领取了计划使用的主要铝型材料。在领取过程中，仔细核对了型材的规格、长度和数量，确保与设计要求一致。对于清单上的组装所需配件（角件、紧固件等），也同步进行了申领，但遗憾的是，部分关键连接配件因库存原因未能即时领取到位。

车架组装启动与灵活应对：

下午，正式启动车架的实物组装工作。

虽然部分预定配件尚未到位，但为了不延误进度并充分利用现有资源，我们果断调整了计划。利用已领取的铝型材，我们首先进行了精确的测量和切割，确保每根型材的长度符合设计要求。

紧接着，我们利用这些切割好的铝材，开始尝试搭建车架的基础框架和主要承力结构。尽管缺少部分专用连接件，我们通过临时固定、比划定位等方式，成功地将铝型材按照设计模型拼搭出了车架的“大致骨架”和核心布局。这个过程让我们对设计的空间关系和结构可行性有了更直观、更深刻的理解，也提前暴露出一些需要微调的地方，并为后续配件到位后的高效组装积累了经验。
            </p> 
        </div>
        
        <!-- 第10天 -->
        <div class="journal-entry">
            <div class="journal-date">第10天 (日期：__7月14日____)</div>
            <p class="placeholder">小组对车架组装方案进行验收，随后到一楼领取铝型材，再对铝型材进行规划，并收集相应的木材，随后对铝型材进行定点切割，之后对车架组装所需配件进行清理，并列出清单，进行审查，之后等待领取组装所需配件，各组在工位上组装车架
                上午九点，小组成员齐聚会议室，正式开启车架组装方案的验收工作。大家围坐在会议桌旁，桌上摊开着详细的组装图纸和流程说明，每个人都手持一份方案副本，逐字逐句地核对细节。技术组长李工率先发言，重点强调了方案中车架承重结构的设计合理性，随后组员们依次提出了关于组装步骤衔接、工具适配性等方面的疑问，经过近一个小时的深入讨论和细节修订，方案最终获得全票通过，为后续工作奠定了坚实基础。​
验收工作结束后，组长指派两名经验丰富的组员前往一楼仓库领取铝型材。仓库内整齐地码放着各种规格的铝型材，他们根据方案清单仔细核对型号、尺寸和数量，用专用卡尺对关键型材进行二次测量，确保没有误差。在仓库管理员的协助下，他们将一根根表面光滑的铝型材小心翼翼地搬运到推车上，用防震泡沫包裹好易磨损部位，平稳地推回车间指定区域。​
回到车间后，小组立刻召开简短碰头会，对铝型材的使用进行详细规划。大家结合组装图纸，在地面铺上防护垫，将铝型材按不同部件需求分类摆放，并在每根型材上用记号笔标注对应的组装位置和切割尺寸。与此同时，另外两名组员前往材料库收集所需木材，他们仔细检查木材的材质、含水率和完整性，确保木材无开裂、无变形，符合车架组装的质量要求。​
规划工作完成后，切割环节正式开始。操作师傅将标注好的铝型材固定在精密切割台上，调整好切割角度和深度，启动设备进行定点切割。切割过程中，冷却液均匀喷洒在切割部位，有效降低了材料的温度，减少了切割误差。每完成一段切割，师傅都会用直尺和量角器进行精确测量，确保切割尺寸与规划要求完全一致，不合格的型材立即标记并重新切割。​
切割工作告一段落，小组成员开始对车架组装所需的配件进行全面清理。他们将螺丝、螺母、连接件等小配件倒入专用清洗篮中，用超声波清洗机进行深度清洁，去除表面的油污和杂质。清洗完成后，大家一起将配件分类摆放在工作台上，逐一检查配件的完好度，剔除变形、损坏的零件。随后，根据组装方案列出详细的配件清单，由组长牵头进行二次审查，确保配件种类齐全、数量充足，避免组装过程中出现配件短缺的情况。​
审查通过后，小组向物资管理部门提交了配件领取申请，进入等待领取组装所需配件的阶段。在此期间，大家并没有闲下来，而是对工位进行了全面整理，清理地面杂物，检查组装工具的性能，确保电钻、扳手等工具运转正常。​
配件到位后，各组成员迅速回到自己的工位，开始有条不紊地组装车架。有的组员负责铝型材的拼接固定，有的专注于木材与金属的连接处理，还有的在一旁进行辅助和质量检查。整个车间里，电钻的嗡鸣声、扳手的敲击声此起彼伏，大家相互配合，严格按照组装流程操作，确保每一个连接点都牢固可靠，每一处细节都符合质量标准。
            </p>
        </div>
        
        <!-- 第11天 -->
        <div class="journal-entry">
            <div class="journal-date">第11天 (日期：___7月15日___)</div>
            <p class="placeholder">小组进行车架组装，对遇到的特殊问题进行了询问，领取所需的亚克力板，对需要进行激光切割的材料进行切割，并且小组完整整体与个人的日志撰写，进行验收
                车架主体拼接工作进入关键阶段，小组成员各司其职，在工位上有条不紊地操作着。突然，负责前叉与车架连接的组员小张停下了手中的工作，眉头微微蹙起 —— 他发现前叉接口的孔径与连接件存在 0.5 毫米的细微偏差，虽然误差极小，但可能影响整体组装精度。他立刻举手示意，组长和技术顾问闻声赶来，大家围在工位旁仔细观察，用游标卡尺反复测量确认。技术顾问王工拿出图纸对比分析，推测可能是配件批次差异导致的问题，随即指导小张记录下问题细节：“把偏差数值、涉及配件编号都记清楚，我们一起去技术部咨询解决方案。”​
一行人来到技术部办公室，将问题详细反馈给技术人员。技术部的工程师们接过图纸和测量数据，在电脑上调出三维模型进行模拟分析，经过半小时的讨论，最终给出了精确的打磨方案：“用细砂纸对接口内侧进行轻微打磨，控制打磨深度在 0.3 毫米以内，既能消除偏差又不影响结构强度。” 小组成员认真记录下解决方案和操作要点，还特意询问了打磨过程中的注意事项，确保完全掌握后才返回车间。​
解决问题的同时，组长安排两名组员前往材料库领取亚克力板。根据组装方案要求，此次需要的是 3 毫米厚的透明亚克力板，用于车架侧面的防护挡板。他们在材料库中仔细挑选，检查板材表面是否有划痕、气泡等瑕疵，用卷尺测量长宽尺寸，确认与图纸要求完全一致后，才办理领取手续。搬运过程中，大家格外小心，用软布包裹板材边缘，避免碰撞损坏。​
回到车间后，小组立刻着手处理需要激光切割的材料。负责切割的组员将亚克力板和部分薄铝片整齐摆放在激光切割机的工作台上，打开电脑连接设备，导入预先设计好的切割图纸。他们仔细核对切割路径、尺寸参数和切割顺序，确认无误后启动设备。激光头在材料表面精准移动，发出细微的 “滋滋” 声，切割产生的青烟被排烟系统及时吸走。每完成一块材料的切割，组员都会用镊子轻轻取下，检查切割边缘是否光滑、尺寸是否精准，合格的材料放入专用收纳盒，等待后续组装使用。​
忙碌的组装工作间隙，小组不忘同步推进日志撰写工作。午休时间，大家围坐在休息区的桌子旁，拿出工作记录本开始整理。组长负责撰写小组整体日志，详细记录当天的工作进展：完成前叉连接部位的问题处理、领取亚克力板 10 块、完成激光切割材料 8 件，同时标注了遇到的问题及解决方案、未完成的工作和次日计划。组员们则专注于个人日志的撰写，记录自己负责的具体工作内容、操作过程中的心得体会以及发现的潜在问题，不少人还在日志中画了简单的示意图，让记录更加直观清晰。​
当天工作接近尾声时，小组进行了阶段性验收。大家将已完成的车架部件和处理好的材料整齐摆放在验收区，组长和技术顾问逐一检查：主体框架的垂直度误差控制在 1 毫米以内，各连接点的螺丝紧固到位，激光切割的亚克力板边缘光滑无毛刺，问题部件经处理后完全符合组装标准。验收过程中，大家还对日志记录情况进行了互查，确保内容完整、数据准确
<img src="imagesC:\图片\AF024ECC0CE8FE4C9F4CA49009DA057C.pn alt="描述文字">

            </p>
        </div>
        
        <!-- 第12天 -->
        <div class="journal-entry">
            <div class="journal-date">第12天 (日期：__7月16日____)</div>
            <p class="placeholder">在小车整体组装工作启动前，技术人员需先对所有零部件进行全面质检，核对配件型号与设计图纸的匹配度，确保底盘、电机、齿轮组等核心部件无磨损或瑕疵。组装阶段严格遵循标准化流程，先固定底盘框架，再依次安装动力系统、转向机构和控制系统，每个环节都需使用扭矩扳手校准紧固件力度，避免过松或过紧导致的故障隐患。线路连接时采用颜色标识区分信号传输线与电源线，确保接口对接精准无误，减少后期排查难度。​
完成组装后立即进入功能测试阶段，搭建包含平直路面、斜坡及弯道的模拟测试场地，通过专业仪器实时监测动力输出曲线、转向角度偏差值和制动响应时间。连续进行 5 轮以上满负载运行测试，记录续航时长、能耗数据及各部件温升情况，形成完整测试报告。​
针对测试中暴露的动力衰减、转向卡顿等问题，技术团队逐项拆解排查。对传动齿轮进行精密研磨校准，更换高耐磨轴承减少机械损耗；通过调试电机驱动程序提升动力稳定性，重新编写转向控制算法修正角度偏差。优化后再次进行全流程验证测试，对比前后数据确认改进效果，最终使小车在各项性能指标上均达到设计标准，确保运行安全与稳定性。</p>
        </div>

        <!-- 第13天 -->
        <div class="journal-entry">
            <div class="journal-date">第13天 (日期：___7月17日___)</div>
            <p class="placeholder">对项目进行成果路演与总结，并进行整体复盘和总结
                上午各组到电机馆开车到名山电影场进行调试
                在预设场地中进行车辆的基本性能展示，包含车辆的启动，加速，转弯等核心功能以及特色亮点功能
                下午进行项目汇报
                阐释半导体器件在项目中的具体应用
                完整开发流程讲解从用户需求分析开始到整车实现的完整过程
                重点突出项目过程中遇到的主要挑战及解决方案
                对电机驱动方案，电池系统，控制系统等进行技术内容说明
            </p>
        </div>
        
        <!-- 第14天 -->
        <div class="journal-entry">
            <div class="journal-date">第14天 (日期：___7月18日___)</div>
            <p class="placeholder">在此处添加第14天的实习内容...</p>
        </div>
    </section>

    <footer>
        <p>© 2025 实习日志 | 记录成长的每一天</p>
    </footer>

    <script>
        // 显示对应部分的内容
        function showSection(sectionId) {
            document.querySelectorAll('section').forEach(section => {
                section.style.display = 'none';
            });
            document.getElementById(sectionId).style.display = 'block';
        }
        
        // 初始化显示项目概述
        document.addEventListener('DOMContentLoaded', function() {
            showSection('overview');
        });
    </script>
</body>
</html>
    